#include "ejercicio.h"
#include "asistentexml.h"

Ejercicio::Ejercicio()
{
    d = new d_Ejercicio;
}

Ejercicio::Ejercicio(const Ejercicio& ejercicio) : d(ejercicio.d)
{
}

Ejercicio::~Ejercicio()
{
}

Ejercicio::Ejercicio(const Patron& patron)
{
    d = new d_Ejercicio;

    NodoEjecucion* nodoEjecucion = new NodoEjecucion();
    nodoEjecucion->agregarPatron(patron);
    NodoIteracion* nodoIteracion = new NodoIteracion();
    nodoIteracion->agregarNodo(nodoEjecucion);
    d->nodoEjercicio->agregarNodo(nodoIteracion);
}

void Ejercicio::iniciar()
{
    if (d->nodoEjercicio == NULL) {
        return;
    }
    d->nodoEjercicio->iniciar();    
}

//bool Ejercicio::haTerminado()
//{
//    if (d->nodoEjercicio == NULL) {
//        return true;
//    }
//    return d->nodoEjercicio->haTerminado();    
//}

bool Ejercicio::esValido()
{
    return d->nodoEjercicio != NULL;
}

Patron Ejercicio::getSiguientePatron()
{
    if (d->nodoEjercicio == NULL) {
        return Patron();
    }

    while (!d->nodoEjercicio->haTerminado()) {
        Patron patron = d->nodoEjercicio->getSiguientePatron();
        if (!patron.esValido()) {
            continue;
        }
        return patron;
    }
    return Patron();
}

bool Ejercicio::haTerminado()
{
    if (d->nodoEjercicio == NULL) {
        return true;
    }
    return d->nodoEjercicio->haTerminado();
}

void Ejercicio::deserializar(const QDomElement& elementoCompas, Proyecto* proyecto)
{
    AsistenteXml asistente(elementoCompas.ownerDocument());

    setNombre(asistente.leerAtributo(elementoCompas, "nombre"));

    d->nodoEjercicio->deserializar(elementoCompas, proyecto);
}